import { faker } from '@faker-js/faker';
import { eventHandler, readBody } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
  sleep,
  unAuthorizedResponse,
  useResponseSuccess,
  useResponseError,
} from '~/utils/response';

// 模拟已存在的车牌号
const existingLicensePlates = new Set();

export default eventHandler(async (event) => {
  const userinfo = verifyAccessToken(event);
  if (!userinfo) {
    return unAuthorizedResponse(event);
  }

  await sleep(600);

  const body = await readBody(event);
  const { licensePlate, brand, model, color, purchaseDate, insuranceDue, inspectionDue, status, fuelConsumption } = body;  // 使用驼峰命名

  // 参数校验
  if (!licensePlate) {  // 使用驼峰命名
    return useResponseError('车牌号不能为空');
  }

  if (!status) {
    return useResponseError('车辆状态不能为空');
  }

  // 检查车牌号是否已存在
  if (existingLicensePlates.has(licensePlate)) {  // 使用驼峰命名
    return useResponseError('该车牌号已存在，请更换');
  }

  // 校验车牌号格式（符合中国机动车号牌标准）
  // 省份简称 + 发行机关代码(A-Z，不含I,O,Z) + 5位号码(数字和字母，不含I,O)
  const licensePlateRegex = /^[京津沪渝冀豫云辽黑湘鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼][A-HJ-NP-Z][A-HJ-NP-Z0-9]{5}$/;
  if (!licensePlateRegex.test(licensePlate)) {  // 使用驼峰命名
    return useResponseError('车牌号格式不正确');
  }

  // 校验油耗范围
  if (fuelConsumption !== undefined && fuelConsumption !== null) {  // 使用驼峰命名
    if (fuelConsumption < 0 || fuelConsumption > 100) {  // 使用驼峰命名
      return useResponseError('标准油耗应在0-100升/百公里之间');
    }
  }

  // 创建新车辆
  const newVehicle = {
    vehicleId: faker.number.int({ min: 1000, max: 9999 }),  // 使用驼峰命名，对应数据库字段vehicle_id
    licensePlate,  // 使用驼峰命名，对应数据库字段license_plate
    brand: brand || '',
    model: model || '',
    color: color || '',
    purchaseDate: purchaseDate || null,  // 使用驼峰命名，对应数据库字段purchase_date
    insuranceDue: insuranceDue || null,  // 使用驼峰命名，对应数据库字段insurance_due
    inspectionDue: inspectionDue || null,  // 使用驼峰命名，对应数据库字段inspection_due
    status: status || '可用',
    fuelConsumption: fuelConsumption || null,  // 使用驼峰命名，对应数据库字段fuel_consumption
    driverName: null,  // 使用驼峰命名，对应数据库字段driver_name
  };

  // 添加到已存在集合
  existingLicensePlates.add(licensePlate);  // 使用驼峰命名

  return useResponseSuccess(newVehicle);
});
